<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="Content-Language" content="zh-CN"><title>systemd-resolved.service
  中文手册 [金步国]</title><style>
@font-face { font-family: "JinBuGuoWebMono"; src: url("http://www.jinbuguo.com/d/mono.ttf") format("truetype"); }
* { font-family: "JinBuGuoWebMono", "Ubuntu Mono", "Consolas", "Menlo", monospace; }
body { margin:10px; }
h1 { text-align:center; background:#ddd; }
h2#auth_name { text-align:center; margin: 10px 5%; }

    a.headerlink {
      color: #c60f0f;
      font-size: 0.8em;
      padding: 0 4px 0 4px;
      text-decoration: none;
      visibility: hidden;
    }

    a.headerlink:hover {
      background-color: #c60f0f;
      color: white;
    }

    h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, dt:hover > a.headerlink {
      visibility: visible;
    }
</style><script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><h1>systemd-resolved.service 中文手册</h1><h2 id="auth_name">译者：<strong><a href="../index.html">金步国</a></strong></h2><hr><h3>版权声明</h3><p>本文译者是一位开源理念的坚定支持者，所以本文虽然不是软件，但是遵照开源的精神发布。</p><ul><li>无担保：本文译者不保证译文内容准确无误，亦不承担任何由于使用此文档所导致的损失。</li><li>自由使用：任何人都可以自由的<u>阅读/链接/打印</u>此文档，无需任何附加条件。</li><li>名誉权：任何人都可以自由的<u>转载/引用/再创作</u>此文档，但必须保留译者署名并注明出处。</li></ul><h3>其他作品</h3><p>本文译者十分愿意与他人分享劳动成果，如果你对我的其他翻译作品或者技术文章有兴趣，可以在如下位置查看现有的作品集：</p><ul><li><a href="../index.html">金步国作品集</a> [ <a href="../index.html">http://www.jinbuguo.com/</a> ]</li></ul><h3>联系方式</h3><p>由于译者水平有限，因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好)，请来信指出，任何提高译文质量的建议我都将虚心接纳。</p><ul><li>Email(QQ)：70171448在QQ邮箱</li></ul><hr><a href="systemd.index.html">手册索引</a> ·
  <a href="systemd.directives.html">指令索引</a><span style="float:right">systemd-241</span><hr><div class="refentry"><a name="systemd-resolved.service"></a><div class="titlepage"></div><div class="refnamediv"><h2>名称</h2><p>systemd-resolved.service, systemd-resolved — 网络名字解析服务</p></div><div class="refsynopsisdiv"><h2>大纲</h2><p><code class="filename">systemd-resolved.service</code></p><p><code class="filename">/usr/lib/systemd/systemd-resolved</code></p></div><div class="refsect1"><a name="id-1.5"></a><h2 id="描述">描述<a class="headerlink" title="Permalink to this headline" href="systemd-resolved.service.html#%E6%8F%8F%E8%BF%B0">¶</a></h2><p><span class="command"><strong>systemd-resolved</strong></span> 为本地应用程序提供了网络名字解析服务。
    它不但提供了传统的 DNS/DNSSEC 解析与本地缓存功能，还提供了 LLMNR 与 MulticastDNS 的解析(resolver)与应答(responder)的功能。
    本地应用程序可以通过三种方式提交网络名字解析请求：</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>第一种，通过D-Bus总线上的本地全功能API <span class="command"><strong>systemd-resolved</strong></span> (详见
      <a class="ulink" href="https://www.freedesktop.org/wiki/Software/systemd/resolved" target="_top">API Documentation</a>)。
      这是首选方法，因为它是异步的并且功能最全。
      此种方式可以正确返回 DNSSEC 的有效状态，以及支持
      link-local 网络所必需的地址的网口范围(interface scope)。</p></li><li class="listitem"><p>第二种，通过 glibc 的
      <a href="http://man7.org/linux/man-pages/man3/getaddrinfo.3.html"><span class="citerefentry"><span class="refentrytitle">getaddrinfo</span>(3)</span></a>,
      <a href="http://man7.org/linux/man-pages/man3/gethostbyname.3.html"><span class="citerefentry"><span class="refentrytitle">gethostbyname</span>(3)</span></a>
      等相关API(<a class="ulink" href="https://tools.ietf.org/html/rfc3493" target="_top">RFC3493</a>)。
      这些API受到了广泛的支持(包括非Linux平台)。此种方法不能检查 DNSSEC 的有效状态，并且是同步的。
      此种方法由 glibc Name Service
      Switch (<a href="http://man7.org/linux/man-pages/man5/nss.5.html"><span class="citerefentry"><span class="refentrytitle">nss</span>(5)</span></a>) 支持。
      必须使用 glibc NSS 模块 <a href="nss-resolve.html#"><span class="citerefentry"><span class="refentrytitle">nss-resolve</span>(8)</span></a>
      才能让 glibc NSS 使用
      <span class="command"><strong>systemd-resolved</strong></span> 提供的名字解析功能。</p></li><li class="listitem"><p>第三种，通过 <span class="command"><strong>systemd-resolved</strong></span> 在本地回环网口 127.0.0.53 上提供的本地DNS服务器。
      应用程序可以直接向 127.0.0.53 发送DNS请求，从而直接使用 <span class="command"><strong>systemd-resolved</strong></span> 提供的解析服务。
      除非确实无法使用前面的 glibc NSS 或 D-Bus API 两种方法，
      否则应该尽量避免使用此种方式，
      因为无法将各种网络解析功能(例如 link-local 地址或 LLMNR Unicode 域名)全部映射到
      单播DNS协议中。</p></li></ul></div><p>DNS服务器来自于
    全局配置文件(<code class="filename">/etc/systemd/resolved.conf</code>)、
    针对单个连接的静态配置文件(<code class="filename">/etc/systemd/network/*.network</code>)(当使用
    <a href="systemd-networkd.service.html#"><span class="citerefentry"><span class="refentrytitle">systemd-networkd.service</span>(8)</span></a> 管理网络时)、
    针对单个连接的动态配置(从DHCP服务器、<a href="resolvectl.html#"><span class="citerefentry"><span class="refentrytitle">resolvectl</span>(1)</span></a>、其他系统服务得到的DNS服务器)。参见
    <a href="resolved.conf.html#"><span class="citerefentry"><span class="refentrytitle">resolved.conf</span>(5)</span></a> 与
    <a href="systemd.network.html#"><span class="citerefentry"><span class="refentrytitle">systemd.network</span>(5)</span></a> 以了解
     systemd 自身的DNS服务器配置。为了提高兼容性，
    仅在 <code class="filename">/etc/resolv.conf</code> 不是一个
    指向 <code class="filename">/run/systemd/resolve/stub-resolv.conf</code>,
    <code class="filename">/usr/lib/systemd/resolv.conf</code>,
    <code class="filename">/run/systemd/resolve/resolv.conf</code> 之一的软连接
    的情况下，才会从 <code class="filename">/etc/resolv.conf</code> 读取
    全局DNS服务器。</p></div><div class="refsect1"><a name="id-1.6"></a><h2 id="合成记录(Synthetic Record)">合成记录(Synthetic Record)<a class="headerlink" title="Permalink to this headline" href="systemd-resolved.service.html#%E5%90%88%E6%88%90%E8%AE%B0%E5%BD%95(Synthetic%20Record)">¶</a></h2><p><span class="command"><strong>systemd-resolved</strong></span> 会为下列特殊域名合成DNS资源记录(RR)：</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>本机的主机名将按如下规则解析：
      如果配置了本机IP地址，
      那么将被解析为所有本机IP地址(按范围排序)。
      如果不存在本机IP地址，
      那么将被解析为本地回环上的 127.0.0.2 与 ::1</p></li><li class="listitem"><p> "<code class="literal">localhost</code>" 与
      "<code class="literal">localhost.localdomain</code>" 以及所有以
       "<code class="literal">.localhost</code>" 或 "<code class="literal">.localhost.localdomain</code>" 结尾的主机名，
      都将被解析为 127.0.0.1 与 ::1 </p></li><li class="listitem"><p> "<code class="literal">_gateway</code>"
      将被解析为所有当前路由表中的默认网关IP地址(按数字大小排序)。
      通过给网关分配一个固定的名称，
      方便了应用程序对网关地址的引用，
      应用程序不再需要关心网络的具体配置。</p></li><li class="listitem"><p>在 <code class="filename">/etc/hosts</code> 中定义的映射关系(正向解析与反向解析)。
      不过需要注意的是，
      这些映射关系对非IP地址类解析(例如MX记录)无效。</p></li></ul></div></div><div class="refsect1"><a name="id-1.7"></a><h2 id="协议与路由">协议与路由<a class="headerlink" title="Permalink to this headline" href="systemd-resolved.service.html#%E5%8D%8F%E8%AE%AE%E4%B8%8E%E8%B7%AF%E7%94%B1">¶</a></h2><p>在将查询请求路由到DNS服务器、LLMNR 与 MulticastDNS 接口时，
    遵守下面的规则：</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>对 "<code class="literal">localhost</code>" 系列特殊域名的查询
      永远不会路由到网络上去。</p></li><li class="listitem"><p>单标签主机名(不含"."的主机名)使用LLMNR协议路由到所有支持IP多播的本地接口。
      对 IPv4 地址的查询只通过 LLMNR 在 IPv4 上查询；对 IPv6 地址的查询只通过 LLMNR 在 IPv6 上查询。
      对本机的主机名、"<code class="literal">_gateway</code>" 以及 <code class="filename">/etc/hosts</code> 中定义的域名的查询
      永远不会路由到 LLMNR 接口。</p></li><li class="listitem"><p>带有 "<code class="literal">.local</code>" 后缀的多标签主机名(含有"."的主机名)使用多播DNS(MulticastDNS)协议
      路由到所有支持IP多播的本地接口。
      与 LLMNR 一样，IPv4 地址只在 IPv4 上查询；IPv6 地址只在 IPv6 上查询。</p></li><li class="listitem"><p>其他多标签主机名(含有"."的主机名)使用DNS协议路由到所有配置了DNS服务器的本地接口。
      如果配置了全局DNS服务器，那么还会路由到全局DNS服务器。从 link-local 地址范围发起的查询永远不会路由到DNS服务器。
      默认情况下，除非 "<code class="literal">.local</code>" 被显式的指定为DNS服务器和网络接口的路由域或搜索域，
      否则不会将带有 "<code class="literal">.local</code>" 后缀的主机名路由到DNS服务器。
      这意味着，如果在特定网络环境中的DNS服务器中定义了 "<code class="literal">.local</code>" 域，
      那么就必须显式的配置搜索域或路由域，以确保可以正常在此DNS域中进行查找。
      注意，应该避免在DNS服务器中定义 "<code class="literal">.local</code>" 域，
      因为 <a class="ulink" href="https://tools.ietf.org/html/rfc6762" target="_top">RFC6762</a> 已将此域专门保留给
      多播DNS(MulticastDNS)使用。</p></li></ul></div><p>如果查询被发送到了多个接口，
    那么将只返回第一个成功的应答。
    如果所有接口上的查询全部失败，
    那么将只返回最后一个失败的应答。</p><p>针对特定网络接口配置的域名以及其他一些设置都会影响对域名查询的路由。详见
    <a href="systemd.network.html#"><span class="citerefentry"><span class="refentrytitle">systemd.network</span>(5)</span></a> 与
    <a href="resolvectl.html#"><span class="citerefentry"><span class="refentrytitle">resolvectl</span>(1)</span></a> 手册。
    单播DNS查询遵守如下路由逻辑：</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>如果查询的名称匹配(等于或具有后缀)
      任何链接上的域(搜索域或路由域)、或全局DNS配置中的域，
      那么，匹配到最多标签的域(搜索域或路由域)，将被视为"最佳匹配域"。
      查询将被发送到与"最佳匹配域"关联的所有DNS服务器(包括来自针对每个链接的DNS服务器以及全局DNS服务器)。
      注意，可能有多个连接都配置了"最佳匹配域"，
      在这种情况下，查询将被同时发送给这些连接。</p></li><li class="listitem"><p>如果查询的名称不匹配任何已配置的域(既不匹配任何链接上的域、也不匹配全局DNS配置中的域)，
      那么将会被发送到设置了"DNS默认路由"选项的连接(可能有多个这样的连接)上的DNS服务器、
      以及全局配置的DNS服务器。</p></li><li class="listitem"><p>如果既没有在任何连接上设置"DNS默认路由"选项，也没有配置全局DNS服务器，
      那么将使用编译时内置的替补DNS服务器。</p></li><li class="listitem"><p>否则查询失败，因为无法确定合适的DNS服务器。</p></li></ul></div><p>"DNS默认路由"选项是一个布尔值，可以使用 <span class="command"><strong>resolvectl</strong></span> 配置，
    也可在 <code class="filename">.network</code> 文件中配置。若未设置，则隐含的基于为链接配置的DNS域推断：
    如果存在任何路由域(不匹配 "<code class="literal">~.</code>")，那么默认为 no ，
    否则默认为 yes</p><p>从效果上看，这意味着，为了更好的将未显式匹配任何域的DNS查询路由到指定的连接，
    可以在该连接上配置一个 "<code class="literal">~.</code>" 路由域。
    这样就可以确保不会使用其他连接(除非也带有这样的路由域)。
    为了确保仅在没有其他更合适连接的情况下，才会将所有此类DNS查询路由到指定的链接，
    应该将该连接的"DNS默认路由"选项设为 yes ，
    并且确保那个连接上没有 "<code class="literal">~.</code>" 路由域。
    最后，为了确保特定的连接永远不会收到任何与其配置的域(搜索域与路由域)不匹配的DNS流量，
    应该将该连接的"DNS默认路由"选项设为 no 。</p><p>参见 <a class="ulink" href="https://www.freedesktop.org/wiki/Software/systemd/resolved" target="_top"> resolved D-Bus API
    Documentation</a> 以了解 <code class="filename">systemd-resolved</code> 所提供的编程接口。</p></div><div class="refsect1"><a name="id-1.8"></a><h2 id="/etc/resolv.conf"><code class="filename">/etc/resolv.conf</code><a class="headerlink" title="Permalink to this headline" href="systemd-resolved.service.html#/etc/resolv.conf">¶</a></h2><p>有四种处理 <code class="filename">/etc/resolv.conf</code> 文件(参见
    <a href="http://man7.org/linux/man-pages/man5/resolv.conf.5.html"><span class="citerefentry"><span class="refentrytitle">resolv.conf</span>(5)</span></a>)
    的方式：</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p><span class="command"><strong>systemd-resolved</strong></span> 实时更新
      <code class="filename">/run/systemd/resolve/stub-resolv.conf</code> 文件以确保兼容传统的 Linux 程序。
      将软连接 <code class="filename">/etc/resolv.conf</code> 指向该文件。该文件将 127.0.0.53
      设为唯一的 DNS 服务器，并包含 systemd-resolved 使用的搜索域列表。
      搜索域列表将会始终保持实时更新。注意，应用程序不应该直接使用
      <code class="filename">/run/systemd/resolve/stub-resolv.conf</code> 文件，
      而应该继续使用 <code class="filename">/etc/resolv.conf</code> 文件(指向它的软连接)。
      这样，未使用本地 D-Bus DNS API 的客户端，既可以与
      <span class="command"><strong>systemd-resolved</strong></span> 通信、又可以正确使用搜索域。
      这是推荐的首选方式。</p></li><li class="listitem"><p>一个静态 <code class="filename">/usr/lib/systemd/resolv.conf</code> 文件，
      此文件仅包含一个唯一的 127.0.0.53 DNS服务器。将软连接
      <code class="filename">/etc/resolv.conf</code> 指向该静态文件。这样，未使用本地 D-Bus DNS API 的客户端，也可以与
      <span class="command"><strong>systemd-resolved</strong></span> 通信。此文件不包含任何搜索域。</p></li><li class="listitem"><p><span class="command"><strong>systemd-resolved</strong></span> 实时更新
      <code class="filename">/run/systemd/resolve/resolv.conf</code> 文件以确保兼容传统的 Linux 程序。
      将软连接 <code class="filename">/etc/resolv.conf</code> 指向该文件。
      注意，此文件只包含所有已知的全局DNS服务器，
      而不包含针对特定网络接口设置的DNS服务器。注意，应用程序不应该直接使用
      <code class="filename">/run/systemd/resolve/resolv.conf</code> 文件，
      而应该继续使用 <code class="filename">/etc/resolv.conf</code> 文件(指向它的软连接)。
      这样，未使用本地 D-Bus DNS API 的客户端，也将同时绕开 <span class="command"><strong>systemd-resolved</strong></span> 服务，
      直接与已知的全局DNS服务器通信。</p></li><li class="listitem"><p>由其他软件包或系统管理员维护 <code class="filename">/etc/resolv.conf</code> 的内容。
      在这种情况下， <span class="command"><strong>systemd-resolved</strong></span> 将会从中读取全局DNS配置。也就是说，
      <span class="command"><strong>systemd-resolved</strong></span> 只是一个 <code class="filename">/etc/resolv.conf</code> 文件的使用者，
      而非此文件的提供者。</p></li></ul></div><p>注意，上述四种处理方式是自动感知的(不需要特别的配置)，完全取决于
    <code class="filename">/etc/resolv.conf</code> 是否为软连接，
    以及该软连接指向的目标。</p></div><div class="refsect1"><a name="id-1.9"></a><h2 id="信号">信号<a class="headerlink" title="Permalink to this headline" href="systemd-resolved.service.html#%E4%BF%A1%E5%8F%B7">¶</a></h2><div class="variablelist"><dl class="variablelist"><dt id="SIGUSR1"><span class="term"><code class="constant">SIGUSR1</code></span><a class="headerlink" title="Permalink to this term" href="systemd-resolved.service.html#SIGUSR1">¶</a></dt><dd><p>让
        <span class="command"><strong>systemd-resolved</strong></span>
        将所有的DNS资源记录缓存以及DNS服务器特性(例如是否支持DNSSCE)
        转储到系统日志中。</p></dd><dt id="SIGUSR2"><span class="term"><code class="constant">SIGUSR2</code></span><a class="headerlink" title="Permalink to this term" href="systemd-resolved.service.html#SIGUSR2">¶</a></dt><dd><p>让
        <span class="command"><strong>systemd-resolved</strong></span> 刷新所有缓存。
        因为 <span class="command"><strong>systemd-resolved</strong></span>
        会在网络配置发生变化时自动刷新缓存，所以，除非出于调试目的，否则一般不需要发送此信号。
        虽然发送此信号相当于执行 <span class="command"><strong>resolvectl --flush-caches</strong></span> 命令，
        但是仍然建议使用命令而不是发送此信号，因为命令是以同步方式执行的。</p></dd><dt id="SIGRTMIN+1"><span class="term"><code class="constant">SIGRTMIN+1</code></span><a class="headerlink" title="Permalink to this term" href="systemd-resolved.service.html#SIGRTMIN+1">¶</a></dt><dd><p>让
        <span class="command"><strong>systemd-resolved</strong></span>
        忘记所有已缓存的DNS服务器特性，特别是DNS服务器对于各种技术标准的支持。
        这样，在执行下一次DNS查询的时候，将会重新检测DNS服务器的各项特性。
        因为
        <span class="command"><strong>systemd-resolved</strong></span> 会在DNS配置发生变化时自动刷新缓存的DNS服务器特性，
        所以，除非出于调试目的，否则一般不需要发送此信号。虽然发送此信号相当于执行
        <span class="command"><strong>resolvectl --reset-server-features</strong></span> 命令，
        但是仍然建议使用命令而不是发送此信号，因为命令是以同步方式执行的。</p></dd></dl></div></div><div class="refsect1"><a name="id-1.10"></a><h2 id="参见">参见<a class="headerlink" title="Permalink to this headline" href="systemd-resolved.service.html#%E5%8F%82%E8%A7%81">¶</a></h2><p>
      <a href="systemd.html#"><span class="citerefentry"><span class="refentrytitle">systemd</span>(1)</span></a>,
      <a href="resolved.conf.html#"><span class="citerefentry"><span class="refentrytitle">resolved.conf</span>(5)</span></a>,
      <a href="dnssec-trust-anchors.d.html#"><span class="citerefentry"><span class="refentrytitle">dnssec-trust-anchors.d</span>(5)</span></a>,
      <a href="nss-resolve.html#"><span class="citerefentry"><span class="refentrytitle">nss-resolve</span>(8)</span></a>,
      <a href="resolvectl.html#"><span class="citerefentry"><span class="refentrytitle">resolvectl</span>(1)</span></a>,
      <a href="http://man7.org/linux/man-pages/man5/resolv.conf.5.html"><span class="citerefentry"><span class="refentrytitle">resolv.conf</span>(5)</span></a>,
      <a href="http://man7.org/linux/man-pages/man5/hosts.5.html"><span class="citerefentry"><span class="refentrytitle">hosts</span>(5)</span></a>,
      <a href="systemd.network.html#"><span class="citerefentry"><span class="refentrytitle">systemd.network</span>(5)</span></a>,
      <a href="systemd-networkd.service.html#"><span class="citerefentry"><span class="refentrytitle">systemd-networkd.service</span>(8)</span></a>
    </p></div></div></body></html>
